0876. 链表的中间结点【简单】
1. 📝 题目描述
给你单链表的头结点 head,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:

输出:[3,4,5]
解释:链表只有一个中间结点,值为 3。1
2
2
示例 2:

输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4,返回第二个结点。1
2
3
2
3
提示:
- 链表的结点数范围是
[1, 100] 1 <= Node.val <= 100
2. 🎯 s.1 - 先确定长度,再找中间
js
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function (head) {
// 获取到链表的总长度
let len = 1,
root = head
while (head.next) {
len++
head = head.next
}
// 找中点
for (let i = 0; i < Math.floor(len / 2); i++) {
root = root.next
}
return root
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 时间复杂度:
,两次线性遍历(统计长度 + 定位中点) - 空间复杂度:
算法思路:
- 第一次遍历统计链表长度
len - 按题意需要返回两个中点中的第二个,因此目标位置为第
个节点(0 基) - 第二次遍历从头出发走到该位置并返回该节点
3. 🎯 s.2 - 快慢指针
js
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function (head) {
let slow = (fast = head)
while (fast.next !== null && fast.next.next !== null) {
slow = slow.next
fast = fast.next.next
}
return slow
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 时间复杂度:
- 空间复杂度:
算法思路:
- 设
slow每次走一步,fast每次走两步 - 当
fast到达链表尾部(fast == null或fast.next == null)时,slow指向中间节点 - 在长度为偶数时,
slow会停在两个中点的第二个,满足题意